import { fontSize } from "@/utils/rem/rem.js";
/**
 * 金额格式化方法。添加千分位分隔符
 * @param amount 金额，必须可以转换成数字，如果不能会直接返回
 * @param unit 是否格式化成万，有传入的时候为万，没有传入则为元
 * @returns {string|*} 返回带千分符的数字
 */
export function amountFormat(amount, number, unit) {
  let num = number
  if (isNaN(amount)) {
    if (typeof amount === "number") return "0.00";
    return amount;
  }
  if (amount === "") return "0.00";
  if (amount === null) {
    amount = 0;
    amount = amount.toFixed(num).toString();
    return amount;
  } else {
    var flag = amount.toString().search("-") != -1;
    amount = unit ? amount / 10000 : amount;
    amount = amount.toString().replace(/[^\d.]/g, ""); //清除"数字"和"."以外的字符
    let val1 = parseFloat(amount).toFixed(num); //保留两位小数
    let val2 = val1.toString();
    let arr = val2.split(".");
    let arr1 = arr[0].split("");
    let str3 = "";
    let arr2 = [];
    for (let i = arr1.length - 1, j = 0; i >= 0; i--, j++) {
      str3 = "" + arr1[i] + str3;
      if (j % 3 == 2) {
        arr2.unshift(str3);
        str3 = "";
      } else if (i == 0) {
        arr2.unshift(str3);
      }
    }
    let str4 = arr2.join(",");
    let decimal = arr[1] ? "." + arr[1] : ""
    let amountFormat = str4 + decimal;
    if (flag) {
      amountFormat = "-" + amountFormat;
    }
    return amountFormat;
  }
}

//文字展示数量限制
export function limitLabelNumber(value, max) {
  var ret = ""; //拼接加\n返回的类目项
  var maxLength = max; //每项显示文字个数
  var valLength = value.length; //X轴类目项的文字个数
  var rowN = Math.ceil(valLength / maxLength); //类目项需要换行的行数
  if (rowN > 1) {
    //如果类目项的文字大于4,
    for (var i = 0; i < rowN; i++) {
      var temp = ""; //每次截取的字符串
      var start = i * maxLength; //开始截取的位置
      var end = start + maxLength; //结束截取的位置
      //这里也可以加一个是否是最后一行的判断，但是不加也没有影响，那就不加吧
      temp = value.substring(start, end) + "\n";
      ret += temp; //凭借最终的字符串
    }
    return ret;
  } else {
    return value;
  }
}

// 金额设置千分位
export const numberToCurrencyNo = (value) => {
  if (value === 0) return 0;

  if (!value) return '-';
  // 获取整数部分
  const intPart = Math.trunc(value);
  // 整数部分处理，增加,
  const intPartFormat = intPart
    .toString()
    .replace(/(\d)(?=(?:\d{3})+$)/g, "$1,");
  // 预定义小数部分
  let floatPart = "";
  // 将数值截取为小数部分和整数部分
  const valueArray = value.toString().split(".");
  if (valueArray.length === 2) {
    // 有小数部分
    floatPart = valueArray[1].toString(); // 取得小数部分
    return intPartFormat + "." + floatPart;
  }
  return intPartFormat + floatPart;
};

/**
 *@getPercentValue 最大剩余额算法
 *@param list 饼图数据
 *@param index 索引
 *@param precision 小数点位数
 *@return 占比
 */
export const getPercentValue = (list, index, precision) => {
  const newList = list.map(v => Number(v));
  // 判断是否为空
  if (!newList[index]) {
    return Number(0).toFixed(precision);
  }
  // 求和
  const sum = newList.reduce((acc, val) => {
    return acc + (isNaN(val) ? 0 : val);
  }, 0);
  if (sum === 0) {
    return Number(0).toFixed(precision);
  }
  // 10的2次幂是100，用于计算精度。
  const digits = Math.pow(10, precision);
  // 扩大比例100，
  const votesPerQuota = newList.map(val => {
    return ((isNaN(val) ? 0 : val) / sum) * digits * 100;
  });
  // 总数，扩大比例意味的总数要扩大
  const targetSeats = digits * 100;
  // 再向下取值，组成数组
  const seats = votesPerQuota.map(votes => {
    return Math.floor(votes);
  });
  // 再新计算合计，用于判断与总数量是否相同，相同则占比会100%
  let currentSum = seats.reduce((acc, val) => {
    return acc + val;
  }, 0);
  // 余数部分的数组：原先数组减去向下取值的数组，得到余数部分的数组
  const remainder = votesPerQuota.map((votes, index) => {
    return votes - seats[index];
  });
  // 给最大最大的余额加1，凑个占比100%；
  while (currentSum < targetSeats) {
    //  找到下一个最大的余额，给其加1
    let max = Number.NEGATIVE_INFINITY;
    let maxId = null;
    for (let i = 0, len = remainder.length; i < len; ++i) {
      if (remainder[i] > max) {
        max = remainder[i];
        maxId = i;
      }
    }
    // 对最大项余额加1
    ++seats[maxId];
    // 已经增加最大余数加1，则下次判断就可以不需要再判断这个余额数。
    remainder[maxId] = 0;
    // 总的也要加1，为了判断是否总数是否相同，跳出循环。
    ++currentSum;
  }
  // 这时候的seats就会总数占比会100%
  return (seats[index] / digits).toFixed(precision);
}; 

/**
 *@getChartTootipFormatter 获取echarts悬浮框
 *@param list 需展示的悬浮框数据
 *@param config 展示内容项 config: { titleKey: 标题key, itemKey: 选项key, valueKey: 值key}
 *@return html结构
 */
export const getChartTootipFormatter = (list, config = { titleKey: 'name', itemKey: 'seriesName', valueKey: 'value' }, showTitle = true) => {
  const title = showTitle ? `<div style="font-size: 16px; color: #1D2129;margin-bottom: 16px">${list[0][config.titleKey]}</div>` : ''
  return `<div>
    ${title}
    ${list.map((item, index) => {
    return `<div style="display:flex;align-items: center;justify-content: space-between;margin-bottom: ${index === list.length - 1 ? 0 : 10}px;font-size: 14px;color:#1D2129;">
        <div style="display:flex;align-items: center;margin-right: 20px;">
          <div style="margin-top: 1px">${item.marker}</div>
          <div style="margin-left: 5px;">${item[config.itemKey]}</div>
        </div> 

        <div>${addThousandsSeparator(item[config.valueKey])}</div>
      </div>`
  }).join(' ')}
  </div>`
}

/**
 *@addThousandsSeparator  单独设置千分位
 *@param number 数值
 *@return 处理为千分位的字符串
 */
export const addThousandsSeparator = number => {
  if ([null, undefined, ""].includes(number)) {
    return "-";
  }

  let str = typeof number === "number" ? number.toString() : number;

  return str.replace(/\d+/, n => {
    // 先提取整数部分
    return n.replace(/(\d)(?=(\d{3})+$)/g, $1 => {
      // 对整数部分添加分隔符
      return $1 + ",";
    });
  });
};